﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using DataAccess;

namespace BusinessLogic
{
    public class Tecnico : Persona
    {
        #region CONSTRUCTORES

        public Tecnico() { }
        public Tecnico(long pNro, string pMail, string pNom, string pAp, string pTel, string pInt, string pSec, string pPass) 
            : base( pNro,  pMail,  pNom,  pAp,  pTel,  pInt,  pSec,  pPass)
        {}

        #endregion

        #region METODOS

        //Agregar nuevo Tecnico.
        public void addTecnico()
        {
            ControllerTecnico.getInstancia().insertTecnico((Int32)this.NroFuncionario, this.Nombre, this.Apellido, this.Telefono, this.Interno, this.Mail, this.Seccion);

        }

        //Dar Tecnico por numero de funcionario.
        public static Tecnico getTecnicoByNro(long pNro)
        {
            DataTable dt = ControllerTecnico.getInstancia().getTecnicoByNro((Int32)pNro);
            //Se parsea y devuelve al tipo Tecnico solo el primer item de la lista porque 
            //solo puede haber uno, ya que la consulta utilizada es por numnero de funcionario.
            return ((Persona.parseRegToPersona(dt)).Count() != 0) ? Tecnico.Parse((Persona.parseRegToPersona(dt))[0]) : null;

        }

        //Dar Tecnico por nombre.
        public static List<Tecnico> getTecnicosByName(string pNom, string pAp)
        {
            DataTable dt = ControllerTecnico.getInstancia().getTecnicoByName(pNom, pAp);
            List<Persona> lstP = Persona.parseRegToPersona(dt);
            //Se castea la lista de "personas" a una de "tecnicos"
            List<Tecnico> lstT = lstP.Cast<Tecnico>().ToList();
            //Se retorna la lista de tecnicos con el nombre y apellido requeridos.
            return lstT;
        }

        //Dar Tecnicos por estado.
        public static List<Tecnico> getTecnicosByEstado(bool pEstado)
        {
            DataTable dt = ControllerTecnico.getInstancia().getTecnicosByEstado(pEstado);
            List<Persona> lstP = Persona.parseRegToPersona(dt);
            //Se castea la lista de "personas" a una de "Tecnicos"
            List<Tecnico> lstT = lstP.Cast<Tecnico>().ToList();
            //Se retorna la lista de tecnicos con el estado requerido.
            return lstT;
        }

        //Parsear del Tipo Persona a Tecnico.
        public static Tecnico Parse(Persona p)
        {
            Tecnico unT = new Tecnico();
            unT.NroFuncionario = p.NroFuncionario;
            unT.Nombre = p.Nombre;
            unT.Apellido = p.Apellido;
            unT.Telefono = p.Telefono;
            unT.Interno = p.Interno;
            unT.Mail = p.Mail;
            unT.Seccion = p.Seccion;
            unT.Contrasenia = p.Contrasenia;
            unT.Activo = p.Activo;

            return unT;
        }

        //Dar lista de tecnicos y cantidad de tickets asignados a cada uno.
        public static DataTable getTecnicosAndTickets()
        {
            return ControllerTecnico.getInstancia().getTecnicosByCantSol();
        }

        #endregion
    }
}
